package com.example.demo.repository;

import com.example.demo.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import java.util.Optional;

/**
 * 用户数据访问层（Repository/DAO）
 * 继承 JpaRepository，自动获得常用的 CRUD 方法
 *
 * JpaRepository<User, Long> 说明：
 * - User: 实体类类型
 * - Long: 主键类型
 *
 * 自动提供的方法包括：
 * - save(User) - 保存或更新用户
 * - findById(Long) - 根据 ID 查询用户
 * - findAll() - 查询所有用户
 * - deleteById(Long) - 根据 ID 删除用户
 * - count() - 统计用户数量
 * 等等...
 *
 * @Repository - 声明这是一个数据访问层组件，Spring 会自动扫描并注册为 Bean
 */
@Repository
public interface UserRepository extends JpaRepository<User, Long> {

    /**
     * 根据邮箱查询用户
     * Spring Data JPA 会根据方法名自动生成查询语句
     * 方法名规则：findBy + 字段名（首字母大写）
     *
     * @param email 用户邮箱
     * @return Optional<User> - 可能存在也可能不存在的用户对象
     */
    Optional<User> findByEmail(String email);

    /**
     * 根据邮箱判断用户是否存在
     * 方法名规则：existsBy + 字段名（首字母大写）
     *
     * @param email 用户邮箱
     * @return boolean - 存在返回 true，不存在返回 false
     */
    boolean existsByEmail(String email);

    /**
     * 根据姓名模糊查询用户
     * 方法名规则：findBy + 字段名 + Containing（包含）
     * 相当于 SQL: SELECT * FROM users WHERE name LIKE '%name%'
     *
     * @param name 用户姓名（支持部分匹配）
     * @return 匹配的用户列表
     */
    java.util.List<User> findByNameContaining(String name);
}
